package mugen.ro;

import java.util.EnumMap;

import java.util.Map;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
import mugen.ro.CharStats.Stat;

public class OptimalCalc {

	
	
	public Map<Stat,Integer> statMap = new EnumMap<Stat, Integer>(Stat.class);
	public Map<Stat,Integer> optimalStatMap = new EnumMap<Stat, Integer>(Stat.class);
	
	//public Map<Stat,Integer> minimalStats = new EnumMap<Stat, Integer>(Stat.class);
	
	//public Map<Stat,Integer> statBonuses = new EnumMap<Stat, Integer>(Stat.class);
	
	private int[] statCosts = Formulas.getStatCosts();
	private int maxStats = 2211;//Formulas.getStatsForLvl(130);
	
	
	CharStats charStats;
	
	public OptimalCalc(CharStats cs){
		
		this.charStats= cs;
                maxStats =Formulas.getStatsForLvl(cs.level);
                maxStats -= statCosts[cs.baseVit];
                maxStats -= statCosts[cs.baseAgi];
                
                init();
	}
	
        public void runCalcs(){
            calcOptimal(0);
        }
        
	private int calcStatsCost(){
		
		int totalCost = 0;
		for(int s : statMap.values()){
			totalCost += statCosts[s];
			
		}
		return totalCost;
		
	}
	
	
	
	public final void init(){
		/*minimalStats.put(Stat.INT, 1);
		minimalStats.put(Stat.STR, 1);
		minimalStats.put(Stat.DEX, 71);
		minimalStats.put(Stat.LUK, 1);*/
		
		statMap.putAll(charStats.minimalStats);
		/**/				
	}
	public int perms = 0;
	public Double maxDmg = 0.0;
	public void calcOptimal(int stIdx){

		Stat cStat = Stat.values()[stIdx];		 
		while(statMap.get(cStat) < Formulas.MAXSTAT){
			
			statMap.put(cStat, statMap.get(cStat)+1);
			perms++;
			if(calcStatsCost() > maxStats)
				break;
			//Double totalAtk = Formulas.getTotalAtk(statMap.get(Stat.STR), statMap.get(Stat.DEX), statMap.get(Stat.LUK), 130, 175, 3, Formulas.Size.LARGE, 7, 0.4, 25);
			//Double asuraDmg = Formulas.asuraDmg(Formulas.getMaxSp(60.0, 0.0, 130, new Double(statMap.get(Stat.INT)))+9, totalAtk);
			//http://forums.irowiki.org/showthread.php?t=83001
			
			int stre = statMap.get(Stat.STR)+charStats.statBonuses.get(Stat.STR);
			int dext = statMap.get(Stat.DEX)+charStats.statBonuses.get(Stat.DEX);
			int luck = statMap.get(Stat.LUK)+charStats.statBonuses.get(Stat.LUK);
			int inte = statMap.get(Stat.INT)+charStats.statBonuses.get(Stat.INT);
			
			Double ppc = charStats.ppchange?Formulas.getPPchangeBonus(stre, dext):0;
                        
			Double totalAtk = Formulas.getTotalAtk(stre, dext, luck, charStats.level, charStats.weaponAtk, charStats.weaponLvl, Formulas.Size.LARGE, charStats.weaponUpgrade, charStats.cardDmgModifier, ppc.intValue()+charStats.quipAtk);
			Double asuraDmg = Formulas.asuraDmg(Formulas.getMaxSp(charStats.spModifier, charStats.spAdded, charStats.level, new Double(inte)), totalAtk);
			
			
			if(asuraDmg > maxDmg){
				maxDmg = asuraDmg;
				optimalStatMap.putAll(statMap);
			}
			

			if((stIdx+1) < Stat.values().length){
				calcOptimal(stIdx+1);
				
				statMap.put(Stat.values()[stIdx+1], charStats.minimalStats.get(Stat.values()[stIdx+1]));
			}
                        if(charStats.skipStats.get(Stat.values()[stIdx])){
                            break;
                        }
			
			
		}
		
	}
}
